#include <iostream>
#include <functional>
#include <memory>
#include <unistd.h>
#include "Thread_Pool.hpp"

using func_t = std::function<void()>;

void Run()
{
    std::cout << "正在执行！" << std::endl;
    sleep(1);
}

class Del
{
    public:
        void operator () (Thread_Pool::ThreadPool<func_t>*&& ptr)
        {
            // if(ptr)
            // {
            //     delete ptr;
            //     ptr = nullptr;
            // }
            std::cout << "智能指针析构！" << std::endl;
        }
};

int i = 0;

int main()
{
    // 使用智能指针时记得初始化。
    //std::unique_ptr<Thread_Pool::ThreadPool<func_t>*> ptr = std::make_unique<Thread_Pool::ThreadPool<func_t>>();

    Thread_Pool::ThreadPool<func_t>* ptr;

    // 类函数并不是存储在类内的。
    // 只凭一个空指针也可以调用类函数。
    ptr = ptr->GetInc();

    // C++11的可读性不是很好。把他当做自动加*就行了。
    // 使用unique会被析构方式错了，所以导致段错误。
    //std::unique_ptr<Thread_Pool::ThreadPool<func_t>> un = std::make_unique<Thread_Pool::ThreadPool<func_t>>(ptr);

    std::unique_ptr<Thread_Pool::ThreadPool<func_t>,Del> un(ptr);

    //std::unique_ptr<Thread_Pool::ThreadPool<func_t>*> ptr = std::make_unique<Thread_Pool::ThreadPool<func_t>*>
    //(Thread_Pool::ThreadPool<func_t>::GetInc());

    //std::unique_ptr<Thread_Pool::ThreadPool<func_t>*> tptr = std::make_unique<>

    //ptr->GetInc();

    // ptr->Start();

    // ptr->Stop();

    // ptr->Join();

    // while(i < 10)
    // {
    //     ptr->Enqueue(Run);
    //     //un->Enqueue(Run);
    //     sleep(1);
    //     ++i;
    // }

    un->GetInc();

    un->Start();

    while(i < 10)
    {
        ptr->Enqueue(Run);
        //un->Enqueue(Run);
        sleep(1);
        ++i;
    }

    un->Stop();

    un->Join();

    return 0;
}